// 前⾯获取参数的⽅式都是⼀个个参数的读取，⽐较⿇烦，Gin框架⽀持将请求参数⾃动绑定到⼀个struct对象，这种⽅式⽀持Get/Post请求，也⽀持http请求body内容为json/xml格式的参数。

// struct标签说明：
// json:"name" 数据格式为json格式，并且json字段名为name
// form:"name" 表单参数名为name
// 提⽰：你可以根据⾃⼰的需要选择⽀持的数据类型，例如需要⽀持json数据格式，可以这样定义字段标签:json:"name"
// 下⾯看下代码：
package main

import (
	"github.com/gin-gonic/gin"
	"log"
)

type User struct {
	Name  string `json:"name" form:"name"`
	Email string `json:"email" form:"email"`
}

func main() {
	// 1.创建路由
	// 默认使用了2个中间件Logger(), Recovery()
	r := gin.Default()

	r.POST("/user/:id", func(c *gin.Context) {
		//初始化userstruct
		u := User{}
		//通过ShouldBind函数，将请求参数绑定到struct对象，处理json请求代码是⼀样的。
		//如果是post请求则根据Content-Type判断，接收的是json数据，还是普通的http请求参数
		if c.ShouldBind(&u) == nil {
			//绑定成功，打印请求参数
			log.Println(":::", u.Name)
			log.Println(":::", u.Email)
		}
		//http请求返回⼀个字符串
		c.String(200, "Success")
	})

	r.Run(":8080")

	//ShouldBind有⼀系列函数，⼤致就是把前⾯的⽅式绑定到结构体的⽅式，如：ShouldBindUri()、ShouldBindQuery()等等，
	//⽤法和ShouldBind类似，这⾥就不展开介绍了。 提⽰：如果你通过http请求body传递json格式的请求参数，并且通过post请求的⽅式提交参数，
	//则需要将Content-Type设置为 application/json,如果是xml格式的数据，则设置为application/xml
}
